home *** CD-ROM | disk | FTP | other *** search
- unit GetDrive;
-
- interface
- uses
- Crt;
-
- type
- TFCB = Record
- Drive: Byte;
- Name: array[0..7] of Char;
- Ext: array[0..2] of Char;
- CurBlock: Word;
- RecSize: Word;
- FileSize: LongInt;
- FileDate: Word;
- FileTime: Word;
- Reserved: array[0..7] of Char;
- CurRec: Byte;
- RandRec: LongInt;
- end;
-
- TDBP = Record
- Drive: Byte;
- AUnit: Byte;
- SectorSize: Word;
- Rest: array[0..28] of Byte;
- end;
- PDBP = ^TDBP;
-
-
- procedure GetDrives;
-
- implementation
- var
- Sx: array[0..80] of Char;
- FCBx: TFCB;
- DBP: PDBP;
-
- function ISOK(Drive: Byte): Boolean; assembler;
- asm
- push ds
- mov dl, Drive
- mov ah, 32h
- int 21h
- cmp al, $FF
- jz @error
- mov cx, ds
- mov es, cx
- pop ds
- mov word ptr DBP, bx
- mov word ptr DBP + 2, es
- mov al, 1
- jmp @Ok
- @error:
- pop ds
- mov al, 0
- @Ok:
- end;
-
-
- function GetInfo: Boolean; assembler;
- asm
- push bp
- push ds
- mov si, seg Sx
- mov ds, si
- mov si, offset sx
- mov di, seg FCBx
- mov es, di
- mov di, offset fcbx
- mov al, 1
- mov ah, 29h
- int 21h
- mov bl, al
- mov ax, 1
- cmp bl, $FF
- jnz @Done
- mov ax, 0
- @Done:
- pop ds
- pop bp
- end;
-
- procedure GetDrives;
- var
- S1: String;
- i: Integer;
- bad: Boolean;
- S: PChar;
-
- begin
- GetMem(S, 80);
- S1 := 'c:*.*';
- FillChar(FCBx, SizeOf(TFCB), #0);
- for i := 0 to 25 do begin
- S1[1] := Chr(i + 65);
- move(S1[1], Sx, Length(S1));
- S[Length(S1)] := #0;
- Bad := GetInfo;
- if bad then begin
- Write(S1);
- if (i = 0) or (i = 1) then
- WriteLn(' -> Normal')
- else
- if IsOk(i+1) then WriteLn(' -> Normal')
- else WriteLn(' -> Special');
- end;
- end;
- FreeMem(S, 80);
- end;
- end.
-
- { ------------------------------- DEMO --------------------------- }
-
- {
- This code shows how to find information about which drives
- exist on the system. It returns the information without
- ever causing an error message to appear on screen.
-
- }
- program Drives;
- uses
- GetDrive,
- Crt;
-
- begin
- ClrScr;
- GetDrives;
- ReadLn;
- end.